/************************ (C) COPYLEFT 2018 Merafour *************************
* File Name          : mIni.h
* Author             : Merafour
* Last Modified Date : 04/05/2020
* Description        : 配置文件解析.
********************************************************************************
* https://merafour.blog.163.com
* merafour@163.com
* https://github.com/merafour
******************************************************************************/
#ifndef _M_INI_
#define _M_INI_

#include <stdint.h>
//#include <stddef.h>
//#include <stdlib.h>
//#include <string.h>
//#include <assert.h>
//#include <errno.h>
//#include <ctype.h>
//#include <string.h>
//#include <memory.h>

#ifdef __cplusplus
 extern "C" {
#endif

//#define INI_FW_VER                      "0.1.0"

// 不采用数据结构方式,直接操作缓存
/* ------------------------------------------------------- 读配置信息 ------------------------------------------------------------- */
// 创建空模板
extern int mIni_list_empty(char Ini[], const uint16_t iSize);
extern int mIni_list_samples(char Ini[], const uint16_t iSize);
// 更新一项数据,不存在时则添加
extern int mIni_update_item(char Ini[], const uint16_t iSize, const char AppName[], const char KeyName[], const char *__format, ...);
// 删除一项数据
extern int mIni_del(char Ini[], const uint16_t iSize, const char AppName[], const char KeyName[]);
// 返回一个区间偏移量
extern int mIni_get_section(const char Ini[], const uint16_t iSize, const char AppName[], int* const _pos);
// 获取键值对的地址
extern int mIni_get_section_key(const char Ini[], const uint16_t iSize, const char AppName[], const char KeyName[], int* const _pos);
// 获取键值对的值
extern int mIni_get_section_key_value(const char Ini[], const uint16_t iSize, const char AppName[], const char KeyName[], char KeyVal[]);
// 获取缓存大小
//static inline int mIni_Size(const char Ini[], const uint16_t iSize){ return Ini->tlen;}
// 插入一项数据
extern int mIni_del_item(char Ini[], const uint16_t iSize, const int seek);
extern int mIni_print(char Ini[], const uint16_t iSize, const char *__format, ...);
extern int mIni_get_field(const char Ini[], const uint16_t iSize, const char section[], const char _key[], const char dft[], char _value[]);

/*********************************************************** Ini 数据操作 ************************************************************************/
extern int mIni_get_int(const char Ini[], const uint16_t iSize, const char section[], const char _key[], const int dft);
extern double mIni_get_double(const char Ini[], const uint16_t iSize, const char section[], const char _key[], const double dft);
extern int mIni_get_hex(const char Ini[], const uint16_t iSize, const char section[], const char _key[], const int dft);
/*   更新键值对   */
static inline int mIni_update_int(char Ini[], const uint16_t iSize, const char section[], const char _key[], const int value)
{
    return mIni_update_item(Ini, iSize, section, _key, "%d", value);
}
static inline int mIni_update_double(char Ini[], const uint16_t iSize, const char section[], const char _key[], const double value)
{
    return mIni_update_item(Ini, iSize, section, _key, "%f", value);
}

#ifdef __cplusplus
}
#endif

#endif  // _M_INI_
